#include<iostream>
#include<random>
#include<sstream>
#include<iomanip>
#include<atomic>
//#include<iostream>
//生成16字节数据，32个的思想：
//先生成8个0~255的数据
//再通过8字节序号的转换  组成一个特定格式的16字节数据
static std::string uuid()
{
     //一:生成8个0~255的数据
    //1、先生成一个机器随机数，作为种子
    std::random_device rd;
    
    //2、再生成伪随机数
    std::mt19937_64 gernator(rd());
    

    //3、最后生成0~255的数据
    std::uniform_int_distribution<int> uid(0,255);

    std::stringstream ss;
    for(int i=0;i<8;i++)
    {
        ss<<std::setw(2)<<std::setfill('0')<<std::hex<<uid(gernator);
        if(i==3||i==5||i==7)
        ss<<"-";
    }
   

    static std::atomic<size_t> ato(1);//定义一个原子类型整数初始化为一
    size_t num=ato.fetch_add(1);

    for(int i=7;i>=0;i--)
    {
        ss<<std::setw(2)<<std::setfill('0')<<((num>>(i*8))&0xff);
        if(6==i)
        ss<<"-";
    }
    return ss.str();
}
int main()
{
    for(int i=0;i<20;i++)
    {
        std::cout<<uuid()<<std::endl;
    }
    //一:生成8个0~255的数据
    //1、先生成一个机器随机数，作为种子
    // std::random_device rd;
    
    // //2、再生成伪随机数
    // std::mt19937_64 gernator(rd());
    

    // //3、最后生成0~255的数据
    // std::uniform_int_distribution<int> uid(0,255);

    // std::stringstream ss;
    // for(int i=0;i<8;i++)
    // {
    //     ss<<std::setw(2)<<std::setfill('0')<<std::hex<<uid(gernator);
    //     if(i==3||i==5||i==7)
    //     ss<<"-";
    // }
   

    // static std::atomic<size_t> ato(1);//定义一个原子类型整数初始化为一
    // size_t num=ato.fetch_add(1);

    // for(int i=7;i>=0;i--)
    // {
    //     ss<<std::setw(2)<<std::setfill('0')<<((num>>(i*8))&0xff);
    //     if(6==i)
    //     ss<<"-";
    // }
    // std::cout<<ss.str()<<std::endl;
    // return 0;
}